/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package com.adsi.vista;

import com.adsi.logica.LogicaClientesLocal;
import com.adsi.logica.LogicaCuentasLocal;
import com.adsi.modelo.Clientes;
import com.adsi.modelo.Cuentas;
import java.awt.Event;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import org.primefaces.component.commandbutton.CommandButton;
import org.primefaces.component.inputtext.InputText;
import org.primefaces.component.password.Password;
import org.primefaces.component.selectonemenu.SelectOneMenu;
import org.primefaces.event.SelectEvent;
import org.primefaces.model.chart.Axis;
import org.primefaces.model.chart.AxisType;
import org.primefaces.model.chart.BarChartModel;
import org.primefaces.model.chart.ChartSeries;
import org.primefaces.model.chart.HorizontalBarChartModel;

/**
 *
 * @author Estudiante
 */
@ManagedBean(name ="cuentasVista")
@RequestScoped
public class CuentasVista {

    @EJB
    LogicaCuentasLocal logicaCuentas;
    
    @EJB
    LogicaClientesLocal logicaClientes;
    
    
    private InputText txtNumeroCuenta;
    private SelectOneMenu cmbClientes;
    private ArrayList<SelectItem> itemsClientes = null;
    private InputText txtSaldoCuenta;
    private InputText txtEstadoCuenta;
    private Password txtClaveCuenta;
    private List<Cuentas> listaCuentas;
    private CommandButton btnRegistrar;
    private CommandButton btnModificar;
    private CommandButton btnEliminar;
    private CommandButton btnLimpiar;
    private Cuentas selectCuentas;
    
     @PostConstruct
    public void init() {
        createBarModels();
    }
    
    
    public CuentasVista() {
    }

    public InputText getTxtNumeroCuenta() {
        return txtNumeroCuenta;
    }

    public void setTxtNumeroCuenta(InputText txtNumeroCuenta) {
        this.txtNumeroCuenta = txtNumeroCuenta;
    }

    public SelectOneMenu getCmbClientes() {
        return cmbClientes;
    }

    public void setCmbClientes(SelectOneMenu cmbClientes) {
        this.cmbClientes = cmbClientes;
    }

    public ArrayList<SelectItem> getItemsClientes() {
        
        if(itemsClientes==null)
        {
            try {
                itemsClientes=new ArrayList<>();
                List<Clientes> lista=logicaClientes.consultar();
                for (int i = 0; i < lista.size(); i++) {
                    itemsClientes.add(new SelectItem(lista.get(i).getCliCedula(),lista.get(i).getCliNombre() ));
                    
                }
                
            } catch (Exception ex) {
                Logger.getLogger(CuentasVista.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        
        return itemsClientes;
    }

    public void setItemsClientes(ArrayList<SelectItem> itemsClientes) {
        this.itemsClientes = itemsClientes;
    }

    public InputText getTxtSaldoCuenta() {
        return txtSaldoCuenta;
    }

    public void setTxtSaldoCuenta(InputText txtSaldoCuenta) {
        this.txtSaldoCuenta = txtSaldoCuenta;
    }

    public InputText getTxtEstadoCuenta() {
        return txtEstadoCuenta;
    }

    public void setTxtEstadoCuenta(InputText txtEstadoCuenta) {
        this.txtEstadoCuenta = txtEstadoCuenta;
    }

    public Password getTxtClaveCuenta() {
        return txtClaveCuenta;
    }

    public void setTxtClaveCuenta(Password txtClaveCuenta) {
        this.txtClaveCuenta = txtClaveCuenta;
    }

    public List<Cuentas> getListaCuentas() {
       
        if(listaCuentas==null)
        {
            try {
                listaCuentas=logicaCuentas.consultar();
            } catch (Exception ex) {
                Logger.getLogger(CuentasVista.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        
        return listaCuentas;
    }

    public void setListaCuentas(List<Cuentas> listaCuentas) {
        this.listaCuentas = listaCuentas;
    }

    public CommandButton getBtnRegistrar() {
        return btnRegistrar;
    }

    public void setBtnRegistrar(CommandButton btnRegistrar) {
        this.btnRegistrar = btnRegistrar;
    }

    public CommandButton getBtnModificar() {
        return btnModificar;
    }

    public void setBtnModificar(CommandButton btnModificar) {
        this.btnModificar = btnModificar;
    }

    public CommandButton getBtnEliminar() {
        return btnEliminar;
    }

    public void setBtnEliminar(CommandButton btnEliminar) {
        this.btnEliminar = btnEliminar;
    }

    public CommandButton getBtnLimpiar() {
        return btnLimpiar;
    }

    public void setBtnLimpiar(CommandButton btnLimpiar) {
        this.btnLimpiar = btnLimpiar;
    }

    public Cuentas getSelectCuentas() {
        return selectCuentas;
    }

    public void setSelectCuentas(Cuentas selectCuentas) {
        this.selectCuentas = selectCuentas;
    }
    
    
    
    
    
    public void funcion_limpiar()
    {
        txtNumeroCuenta.setValue("");
        cmbClientes.setValue("Seleccionar");
        txtSaldoCuenta.setValue("");
        txtEstadoCuenta.setValue("");
        txtClaveCuenta.setValue("");
        txtNumeroCuenta.setDisabled(false);
        btnRegistrar.setDisabled(false);
        btnModificar.setDisabled(true);
        btnEliminar.setDisabled(true);                     
    }
    
    public void funcion_registrar()
    {
        try {
            Cuentas c = new Cuentas();
            String numero = txtNumeroCuenta.getValue().toString();
            c.setCueNumero(numero);
            Clientes cli = logicaClientes.consultarPorCod(Long.parseLong(cmbClientes.getValue().toString()));
            c.setCliCedula(cli);
            c.setCueSaldo(BigDecimal.valueOf(Double.parseDouble(txtSaldoCuenta.getValue().toString())));
            c.setCueActiva(txtEstadoCuenta.getValue().toString());
            c.setCueClave(txtClaveCuenta.getValue().toString());
            
            logicaCuentas.registrar(c);
            
            FacesContext.getCurrentInstance().addMessage("Mensaje", new FacesMessage(FacesMessage.SEVERITY_INFO, "Informacion", "La cuenta se registro con exito"));

            
        } catch (Exception ex) {
            Logger.getLogger(CuentasVista.class.getName()).log(Level.SEVERE, null, ex);
            FacesContext.getCurrentInstance().addMessage("Mensaje", new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error", ex.getMessage()));

        }
        listaCuentas = null;
        funcion_limpiar();
    }
    
    public void  funcion_modificar()
    {
         try {
            Cuentas c = new Cuentas();
            String numero = txtNumeroCuenta.getValue().toString();
            c.setCueNumero(numero);
            Clientes cli = logicaClientes.consultarPorCod(Long.parseLong(cmbClientes.getValue().toString()));
            c.setCliCedula(cli);
            c.setCueSaldo(BigDecimal.valueOf(Double.parseDouble(txtSaldoCuenta.getValue().toString())));
            c.setCueActiva(txtEstadoCuenta.getValue().toString());
            c.setCueClave(txtClaveCuenta.getValue().toString());
            
            logicaCuentas.modificar(c);
            
            FacesContext.getCurrentInstance().addMessage("Mensaje", new FacesMessage(FacesMessage.SEVERITY_INFO, "Informacion", "La cuenta se Modificó con exito"));

            
        } catch (Exception ex) {
            Logger.getLogger(CuentasVista.class.getName()).log(Level.SEVERE, null, ex);
            FacesContext.getCurrentInstance().addMessage("Mensaje", new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error", ex.getMessage()));

        }
        listaCuentas = null;
        funcion_limpiar();
    }
    
    public void funcion_eliminar() 
    {
        try {
            Cuentas c = new Cuentas();
            c.setCueNumero(txtNumeroCuenta.getValue().toString());
            logicaCuentas.eliminar(c);
            FacesContext.getCurrentInstance().addMessage("Mensaje", new FacesMessage(FacesMessage.SEVERITY_INFO, "Informacion", "La cuenta se Eliminó con exito"));
        } catch (Exception ex) {
            Logger.getLogger(CuentasVista.class.getName()).log(Level.SEVERE, null, ex);
            FacesContext.getCurrentInstance().addMessage("Mensaje", new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error", ex.getMessage()));
        }
        listaCuentas=null;
        funcion_limpiar();
        
    }
    
    public void funcion_seleccionar(SelectEvent event)
    {
        Cuentas cuentaSeleccionada = (Cuentas) event.getObject();
        txtNumeroCuenta.setValue(cuentaSeleccionada.getCueNumero());
        cmbClientes.setValue(cuentaSeleccionada.getCliCedula().getCliCedula());
        txtSaldoCuenta.setValue(cuentaSeleccionada.getCueSaldo());
        txtEstadoCuenta.setValue(cuentaSeleccionada.getCueActiva());
        txtNumeroCuenta.setDisabled(true);
        btnRegistrar.setDisabled(true);
        btnModificar.setDisabled(false);
        btnEliminar.setDisabled(false);
    }
    
        // GRAFICO BAR
    
    private BarChartModel barModel;
    private HorizontalBarChartModel horizontalBarModel;
 
    
 
    public BarChartModel getBarModel() {
        return barModel;
    }
    
     public HorizontalBarChartModel getHorizontalBarModel() {
        return horizontalBarModel;
    }

    
    private void createHorizontalBarModel() {
        horizontalBarModel  = new HorizontalBarChartModel();
 
         List<Cuentas> cue = null;
        try {        
            cue = logicaCuentas.consultar();
        } catch (Exception ex) {
            Logger.getLogger(CuentasVista.class.getName()).log(Level.SEVERE, null, ex);
        }      
        
        
        
        ChartSeries cuenta = new ChartSeries();
        cuenta.setLabel("Cuentas");
        
        for (int i = 0; i < cue.size(); i++) {
            
            cuenta.set(cue.get(i).getCueNumero(),cue.get(i).getCueSaldo());
            
        }
 
        
 
        horizontalBarModel.addSeries(cuenta);
        
        
         
        horizontalBarModel.setTitle("Saldo de cuentas");
        horizontalBarModel.setLegendPosition("e");
        horizontalBarModel.setStacked(true);
         
        Axis xAxis = horizontalBarModel.getAxis(AxisType.X);
        xAxis.setLabel("Saldo");
        xAxis.setMin(0);
        xAxis.setMax(150000);
        
         
        Axis yAxis = horizontalBarModel.getAxis(AxisType.Y);
        yAxis.setLabel("Cuentas"); 
        
    }
     
    private void createBarModels() {
        
        createHorizontalBarModel();
        
    }
     
    
}
